# 它是比线程更小的 执行单元 为什么说它是执行单元 因为它自带CPU上下文  合适的时机
#从一个协程切换到另外一个协程  在这个过程中 保存或者恢复了上下文  程序就可以执行

#还可以理解为一个线程中的函数 可以在任何地方保存 当前函数的一些临时变量信息
#然后切换到另外一个函数去执行  注意 这个切换不是通过 调用函数的方式  这个是有开发者去决定什么时候切换并切换回来


#线程协程 差异 协程的优势
#1.执行效率高  子程序切换不是通过 线程去切换 而是通过 程序自身去控制
#也就是说 这样减少了线程切换的开销    尤其对于多线程  协程优势更加明显

# 不需要多线程的锁机制   协程是在一个线程下执行的 根本不存在写冲突
# 操作共享资源 不需要加锁 只需要判断状态

#多核CPU   多进程 +协程  来实现利用多核CPU资源


#缺点: 只能利用一个CPU核

#greenlet +switch实现协程
import time
from greenlet import greenlet
def fn1():
    print("协程1")
    time.sleep(2)
    g2.switch() #将cpu的执行权交给 g2协程
    print("窗前明月光")
    time.sleep(2)
    g2.switch()

def fn2():
    print("协程2")
    time.sleep(2)
    g1.switch()

    print("地上鞋两双")
    time.sleep(2)
    g1.switch()
if __name__ == '__main__':
    g1 = greenlet(fn1)
    g2 = greenlet(fn2)

    g2.switch()